package com.sc.nft.entity.vo;

import cn.hutool.core.bean.BeanUtil;
import com.sc.nft.entity.SaasTask;
import com.sc.nft.entity.dto.SaasTaskAwardDTO;
import com.sc.nft.entity.dto.SaasTaskAwardPackDTO;
import com.sc.nft.enums.SaasTaskConfigurationEnum;
import com.sc.nft.exception.GlobalRunTimeException;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.Size;
import java.util.List;
@Data
public class SaasTaskStageConfigurationVO {

    @ApiModelProperty(value = "任务开始阶段")
    private Integer startStage;

    @ApiModelProperty(value = "任务结束阶段")
    private Integer endStage;

    @ApiModelProperty(value = "任务外层包装")
    @Size(min = 1, max = 20, message = "任务奖励最多只能配置20个",groups = {SaasTaskAwardPackDTO.class})
    private List<SaasTaskAwardDTO> list;
    /**
     * 任务效验
     */
    private void taskValidation() {
        // 任务奖励的持有nft,权益道具卡不允许重复
        // 把所有的权益道具卡和持有nft放到一个list里面,然后去重,如果去重后的长度和原来的长度不一样,说明有重复的,代码
        // 把所有的list为空的排除掉,获取不为空的部分进行分组.分组后,进行去重,如果去重后的长度和原来的长度不一样,说明有重复的
        // 权重也不可以重复
        if (this.list.stream().mapToInt(SaasTaskAwardDTO::getWeight).distinct().count() != list.size()) {
            throw new GlobalRunTimeException("任务奖励的权重不允许重复");
        }

        long unweighted = this.list.stream().filter(s -> s.getCollectionId() != null).count();
        // 去重
        long deWeight = this.list.stream().filter(s -> s.getCollectionId() != null).mapToLong(SaasTaskAwardDTO::getCollectionId).distinct().count();
        // nft持有不允许持有重复
        if (unweighted != deWeight) {
            throw new GlobalRunTimeException("任务奖励的持有nft不允许重复");
        }
        // 权益道具卡不允许重复
        // 把list中的list集合全部合并成一个集合

        this.list.stream().forEach(s -> {
            // 奖励没去重
            long awardUnweighted = s.getAward().stream().count();
            // 把奖励去重
            long awardDeWeight = s.getAward().stream().mapToLong(dto->dto.getEquityPropsId()).distinct().count();
            if (awardUnweighted != awardDeWeight) {
                throw new GlobalRunTimeException("任务奖励的权益道具卡不允许重复");
            }
        });
    }

    public Boolean addValidator(SaasTask saasTask) {
        if (BeanUtil.isEmpty(saasTask)) {
            throw new GlobalRunTimeException("任务不存在");
        }
        // 只有未配置任务的时候才能配置新增奖励,配置了以后使用的是修改奖励
        if (saasTask.getTaskConfiguration() != SaasTaskConfigurationEnum.NOT_CONFIGURED) {
            throw new GlobalRunTimeException("任务已配置,如需修改请使用修改功能");
        }
        // 任务奖励的持有nft,权益道具卡不允许重复
        // 把所有的权益道具卡和持有nft放到一个list里面,然后去重,如果去重后的长度和原来的长度不一样,说明有重复的,代码
        // 把所有的list为空的排除掉,获取不为空的部分进行分组.分组后,进行去重,如果去重后的长度和原来的长度不一样,说明有重复的
        // 权重也不可以重复
        taskValidation();
        return true;
    }


    public Boolean modificationValidator(SaasTask saasTask) {
        if (BeanUtil.isEmpty(saasTask)) {
            throw new GlobalRunTimeException("任务不存在");
        }
        // 只有未配置任务的时候才能配置新增奖励,配置了以后使用的是修改奖励
        if (saasTask.getTaskConfiguration() != SaasTaskConfigurationEnum.NOT_SUBMITTED_FOR_REVIEW && saasTask.getTaskConfiguration() != SaasTaskConfigurationEnum.REVOCATION_OF_REVIEW && saasTask.getTaskConfiguration() != SaasTaskConfigurationEnum.REVIEW_FAILED) {
            throw new GlobalRunTimeException("当前任务禁止修改奖励");
        }
        taskValidation();
        return true;
    }

}
